﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using VideoLink.Core.Properties;
using VideoLink.Utility;
using System.IO;

namespace VideoLink.Links
{
    /// <summary>
    /// Осуществляет выбор лучшего из доступных средств связи.
    /// Если доступен настоящий смартлинк, 
    /// то подгружается соответствующая библиотека.
    /// Если не доступен, то возвращается FakeLink
    /// </summary>
    /// <remarks>
    /// Имя сборки и имя класса, который реализует доступ к смартлинку, указывается в Settings.
    /// Внимание! Имя класса должно быть полным (например, Namespace1.Namespace2.ClassName)
    /// </remarks>
    public static class LinkLoader
    {
        /// <summary>
        /// Осуществить выбор лучшего из доступных средств связи.
        /// </summary>
        /// <param name="ip">
        /// IP-адрес или DNS компьютера, на котором запущен второй экземпляр программы.
        /// Будет использоваться, если не доступен смартлинк.
        /// </param>
        /// <param name="assembly">
        /// Имя сборки, из которой будет загружаться интерфейс к смартлинку.
        /// </param>
        /// <param name="type">
        /// Имя класса-интерфейса к смартлинку.
        /// </param>
        /// <returns>
        /// Если доступен настоящий смартлинк, 
        /// то подгружается соответствующая библиотека.
        /// Если не доступен, то возвращается FakeLink
        /// </returns>
        public static ILink GetLink(string ip, string assembly, string typeName)
        {
            SmartLink realLink = null;
            try
            {
                DebugLog.Instance
                .WriteLine(String.Format("Пробуем загрузить тип {0} из сборки {1}",
                    typeName,
                    assembly));

                var asm = Assembly.LoadFile(assembly);
                var type = asm.GetType(typeName);
                realLink = new SmartLink(type);
            }
            catch (Exception)
            {
                DebugLog.Instance.WriteLine("Не получилось подключиться к смартлинку.");
                DebugLog.Instance.WriteLine("Используем TCP.");
            }

            return (realLink != null) ? 
                realLink as ILink 
                : new FakeLink(ip, 2010);
        }
    }
}
